React์ experimental_useContextSelector๋ฅผ ํ์ฉํ์ฌ ์ปจํ ์คํธ ๋ฆฌ๋ ๋๋ง์ ์ต์ ํํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๋ฉฐ, ๊ธ๋ก๋ฒ ํ์ ์ํ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ ํ์ธ์. ์ปจํ ์คํธ ๊ฐ์ ์ ํ์ ์ผ๋ก ๊ตฌ๋ ํ๊ณ ๋ถํ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
์ต๊ณ ์ฑ๋ฅ ๊ตฌํ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ React์ experimental_useContextSelector ์ฌ์ธต ๋ถ์
๋์์์ด ์งํํ๋ ํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ React๋ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ๋์ ์ด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํ๋ฉฐ ์ง๋ฐฐ์ ์ธ ์์น๋ฅผ ํ๊ณ ํ ํ์ต๋๋ค. React ์ํ ๊ด๋ฆฌ ํดํท์ ํต์ฌ์ Context API์
๋๋ค. Context API๋ prop drilling ์์ด ์ปดํฌ๋ํธ ํธ๋ฆฌ ์ ์ฒด์์ ์ฌ์ฉ์ ์ธ์ฆ, ํ
๋ง ๋๋ ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ์ฑ๊ณผ ๊ฐ์ ๊ฐ์ ๊ณต์ ํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์
๋๋ค. ๋งค์ฐ ์ ์ฉํ์ง๋ง ํ์ค useContext ํ
์๋ ์ค์ํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ํด๋น ๋ฐ์ดํฐ์ ์์ ๋ถ๋ถ๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ปจํ
์คํธ ๋ด์ ๋ชจ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ชจ๋ ์ฌ์ฉ ์ปดํฌ๋ํธ์ ๋ํ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด ๋ฐ ์ฅ์น ๊ธฐ๋ฅ์ ๊ฐ์ง ์ฌ์ฉ์๋ฅผ ์ํด ์ฑ๋ฅ์ด ๊ฐ์ฅ ์ค์ํ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ํฌ๊ณ ๋ถ์ฐ๋ ํ์ด ๋ณต์กํ ์ฝ๋๋ฒ ์ด์ค์ ๊ธฐ์ฌํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋น ๋ฅด๊ฒ ์ ํ์ํค๊ณ ๊ฐ๋ฐ์ ๋ณต์กํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ง์ ์์ React์ experimental_useContextSelector๊ฐ ๊ฐ๋ ฅํ์ง๋ง ์คํ์ ์ธ ์๋ฃจ์
์ผ๋ก ๋ฑ์ฅํฉ๋๋ค. ์ด ๊ณ ๊ธ ํ
์ ์ปจํ
์คํธ ์๋น์ ๋ํ ์ธ๋ถํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ค์ ๋ก ์์กดํ๋ ์ปจํ
์คํธ ๊ฐ์ ํน์ ๋ถ๋ถ๋ง ๊ตฌ๋
ํ ์ ์๋๋ก ํจ์ผ๋ก์จ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ต์ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ experimental_useContextSelector์ ๋ณต์ก์ฑ์ ํ๊ตฌํ๊ณ , ๊ทธ ๋ฉ์ปค๋์ฆ, ์ด์ ๋ฐ ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ถ์ํฉ๋๋ค. ํนํ ๊ตญ์ ํ์ด ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๊ตฌ์ถํ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ต์ ํํ๋ ๋ฐ ์ ์ด๊ฒ์ด ํ๊ธฐ์ ์ธ์ง ์์ธํ ์์๋ณด๊ณ ํจ๊ณผ์ ์ธ ๊ตฌํ์ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ณดํธ์ ์ธ ๋ฌธ์ : useContext๋ฅผ ์ฌ์ฉํ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง
๋จผ์ experimental_useContextSelector๊ฐ ํด๊ฒฐํ๋ ค๋ ํต์ฌ ๊ณผ์ ๋ฅผ ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค. ํ์ค useContext ํ
์ ์ํ ๋ฐฐํฌ๋ฅผ ๋จ์ํํ๋ฉด์๋ ์ปจํ
์คํธ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ค๋ ๊ฐ๋จํ ์์น์ ๋ฐ๋ผ ์๋ํฉ๋๋ค. ๋ณต์กํ ์ํ ๊ฐ์ฒด๋ฅผ ๋ณด์ ํ๋ ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค.
const GlobalSettingsContext = React.createContext({});
function GlobalSettingsProvider({ children }) {
const [settings, setSettings] = React.useState({
theme: 'dark',
language: 'en-US',
notificationsEnabled: true,
userDetails: {
name: 'John Doe',
email: 'john.doe@example.com',
country: 'USA'
}
});
const updateTheme = (newTheme) => setSettings(prev => ({ ...prev, theme: newTheme }));
const updateLanguage = (newLang) => setSettings(prev => ({ ...prev, language: newLang }));
// ... ๊ธฐํ ์
๋ฐ์ดํธ ํจ์
const contextValue = React.useMemo(() => ({
settings,
updateTheme,
updateLanguage
}), [settings]);
return (
{children}
);
}
์ด์ ์ด ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
function ThemeToggle() {
const { settings, updateTheme } = React.useContext(GlobalSettingsContext);
console.log('ThemeToggle re-rendered'); // ์ปจํ
์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ธฐ๋ก๋ฉ๋๋ค.
return (
Toggle Theme: {settings.theme}
);
}
Hello, {settings.userDetails.name} from {settings.userDetails.country}!function UserGreeting() {
const { settings } = React.useContext(GlobalSettingsContext);
console.log('UserGreeting re-rendered'); // ์ปจํ
์คํธ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ธฐ๋ก๋ฉ๋๋ค.
return (
);
}
์ด ์๋๋ฆฌ์ค์์ language ์ค์ ์ด ๋ณ๊ฒฝ๋๋ฉด ThemeToggle๊ณผ UserGreeting์ด ๋ชจ๋ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ThemeToggle์ theme๋ง ์ ๊ฒฝ ์ฐ๊ณ UserGreeting์ userDetails.name๊ณผ userDetails.country๋ง ์ ๊ฒฝ ์ฐ๋๋ผ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ด๋ฌํ ์ฐ์ ํจ๊ณผ๋ ๊น์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋น๋ฒํ๊ฒ ์
๋ฐ์ดํธ๋๋ ์ ์ญ ์ํ๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋น ๋ฅด๊ฒ ๋ณ๋ชฉ ํ์์ด ๋์ด ๋์ ๋๋ UI ์ง์ฐ๊ณผ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ๊ฒฝํ, ํนํ ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์ ์ ๋ ฅ์ด ์ฝํ ์ฅ์น๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆฐ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ๊ฒฝํ์ ์ด๋ํ ์ ์์ต๋๋ค.
experimental_useContextSelector ์๊ฐ: ์ ๋ฐ ๋๊ตฌ
experimental_useContextSelector๋ ์ปดํฌ๋ํธ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ํจ๋ฌ๋ค์ ์ ํ์ ์ ๊ณตํฉ๋๋ค. ์ ์ฒด ์ปจํ
์คํธ ๊ฐ์ ๊ตฌ๋
ํ๋ ๋์ ์ปดํฌ๋ํธ๊ฐ ํ์๋ก ํ๋ ํน์ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๋ "์ ํ๊ธฐ" ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. React๊ฐ ์ด์ ๋ ๋๋ง์์ ์ ํ๊ธฐ ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ฌ ๋ ๋๋ง๊ณผ ๋น๊ตํ ๋ ๋ง๋ฒ์ด ์ผ์ด๋ฉ๋๋ค. ์ปดํฌ๋ํธ๋ ์ปจํ
์คํธ์ ๋ค๋ฅธ ๊ด๋ จ ์๋ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์๊ณ ์ ํ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
์๋ ๋ฐฉ์: ์ ํ๊ธฐ ํจ์
experimental_useContextSelector์ ํต์ฌ์ ์ ๋ฌํ๋ ์ ํ๊ธฐ ํจ์์
๋๋ค. ์ด ํจ์๋ ์ ์ฒด ์ปจํ
์คํธ ๊ฐ์ ์ธ์๋ก ๋ฐ์๋ค์ด๊ณ ์ปดํฌ๋ํธ๊ฐ ๊ด์ฌ์ ๊ฐ๋ ์ํ์ ํน์ ์กฐ๊ฐ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ React๋ ๊ตฌ๋
์ ๊ด๋ฆฌํฉ๋๋ค.
- ์ปจํ ์คํธ ์ ๊ณต์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด React๋ ๋ชจ๋ ๊ตฌ๋ ์ปดํฌ๋ํธ์ ๋ํด ์ ํ๊ธฐ ํจ์๋ฅผ ๋ค์ ์คํํฉ๋๋ค.
- ์๊ฒฉํ ๋๋ฑ์ฑ ๊ฒ์ฌ(`===`)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ๋ ๊ฐ์ ์ด์ ์ ํ๋ ๊ฐ๊ณผ ๋น๊ตํฉ๋๋ค.
- ์ ํ๋ ๊ฐ์ด ๋ค๋ฅด๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ๊ฐ์ผ๋ฉด ์ปดํฌ๋ํธ๋ ๋ฆฌ๋ ๋๋ง๋์ง ์์ต๋๋ค.
๋ฆฌ๋ ๋๋ง์ ๋ํ ์ด๋ฌํ ์ธ๋ถํ๋ ์ ์ด๊ฐ ๋ฐ๋ก ๊ณ ๋๋ก ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ๊ฒ์ ๋๋ค.
experimental_useContextSelector ๊ตฌํ
์ด ์คํ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํด๋น ๊ธฐ๋ฅ์ด ํฌํจ๋ ์ต์ React ๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์คํ์ ํ๋๊ทธ๋ฅผ ํ์ฑํํ๊ฑฐ๋ ํ๊ฒฝ์์ ํด๋น ๊ธฐ๋ฅ์ ์ง์ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค. "์คํ์ " ์ํ๋ API ๋๋ ๋์์ด ํฅํ React ๋ฒ์ ์์ ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌ๋ฌธ ๋ฐ ์์
์ด์ ์์ ๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ์ฌ experimental_useContextSelector๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ํ์ํ ์คํ์ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค(React ๋ฒ์ ๋๋ ์ค์ ์ ๋ฐ๋ผ ์ฝ๊ฐ ๋ค๋ฅผ ์ ์์).
import React, { experimental_useContextSelector as useContextSelector } from 'react';
์ด์ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌํฉํฐ๋งํด ๋ณด๊ฒ ์ต๋๋ค.
function ThemeToggleOptimized() {
const theme = useContextSelector(GlobalSettingsContext, state => state.settings.theme);
const updateTheme = useContextSelector(GlobalSettingsContext, state => state.updateTheme);
console.log('ThemeToggleOptimized re-rendered');
return (
Toggle Theme: {theme}
);
}
Hello, {userName} from {userCountry}!function UserGreetingOptimized() {
const userName = useContextSelector(GlobalSettingsContext, state => state.settings.userDetails.name);
const userCountry = useContextSelector(GlobalSettingsContext, state => state.settings.userDetails.country);
console.log('UserGreetingOptimized re-rendered');
return (
);
}
์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ํตํด:
theme๋ง ๋ณ๊ฒฝ๋๋ฉดThemeToggleOptimized๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.userName,userCountry์ ํ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์์๊ธฐ ๋๋ฌธ์UserGreetingOptimized๋ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋ฉ๋๋ค.language๋ง ๋ณ๊ฒฝ๋๋ฉดThemeToggleOptimized๊ณผUserGreetingOptimized๋ชจ๋ ๋ฆฌ๋ ๋๋ง๋์ง ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐlanguage์์ฑ์ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
useContextSelector์ ํต์ฌ ๊ธฐ๋ฅ์
๋๋ค.
์ปจํ ์คํธ ์ ๊ณต์ ๊ฐ์ ๋ํ ์ค์ ์ฐธ๊ณ ์ฌํญ
experimental_useContextSelector๊ฐ ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋ ค๋ฉด ์ปจํ
์คํธ ์ ๊ณต์๊ฐ ์ ๊ณตํ๋ ๊ฐ์ด ์ ์ฒด ์ํ๋ฅผ ๋ํํ๋ ์์ ์ ์ธ ๊ฐ์ฒด์ฌ์ผ ํฉ๋๋ค. ์ ํ๊ธฐ ํจ์๊ฐ ์ด ๋จ์ผ ๊ฐ์ฒด์์ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ค์ํฉ๋๋ค. ์ปจํ
์คํธ ์ ๊ณต์๊ฐ value prop์ ๋ํด ์ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฃผ ์์ฑํ๋ ๊ฒฝ์ฐ(์: useMemo ์์ด value={{ settings, updateFn }}) ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ผ๋ ๊ฐ์ฒด ์ฐธ์กฐ ์์ฒด๊ฐ ์๋ก์์ง๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ตฌ๋
์์ ๋ํด ๋ฆฌ๋ ๋๋ง์ ์ค์๋ก ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์์ GlobalSettingsProvider ์์ ์์๋ React.useMemo๋ฅผ ์ฌ์ฉํ์ฌ contextValue๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ฌ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฆ
๋๋ค.
๊ณ ๊ธ ์ ํ๊ธฐ: ๊ฐ ํ์ ๋ฐ ๋ค์ค ์ ํ
์ ํ๊ธฐ ํจ์๋ ํน์ ๊ฐ์ ํ์ํ๋ ๋ฐ ํ์ํ ๋งํผ ๋ณต์กํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ถ์ธ ํ๋๊ทธ ๋๋ ๊ฒฐํฉ๋ ๋ฌธ์์ด์ ์ํ ์ ์์ต๋๋ค.
Status: {notificationText}function NotificationStatus() {
const notificationsEnabled = useContextSelector(
GlobalSettingsContext,
state => state.settings.notificationsEnabled
);
const notificationText = useContextSelector(
GlobalSettingsContext,
state => state.settings.notificationsEnabled ? 'Notifications ON' : 'Notifications OFF'
);
console.log('NotificationStatus re-rendered');
return (
);
}
์ด ์์ ์์ NotificationStatus๋ settings.notificationsEnabled๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ์ปจํ
์คํธ์ ๋ค๋ฅธ ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ์ง ์๊ณ ํ์ ํ
์คํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ํฉ๋๋ค.
์ ์ธ๊ณ ๊ฐ๋ฐ ํ ๋ฐ ์ฌ์ฉ์๋ฅผ ์ํ ์ด์
experimental_useContextSelector์ ์๋ฏธ๋ ๋ก์ปฌ ์ต์ ํ๋ฅผ ํจ์ฌ ๋ฐ์ด๋์ด ๊ธ๋ก๋ฒ ๊ฐ๋ฐ ๋
ธ๋ ฅ์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
1. ๋ค์ํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ํ ์ต๊ณ ์ฑ๋ฅ
- ๋ชจ๋ ์ฅ์น์์ ๋ ๋น ๋ฅธ UI: ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ ๊ฑฐํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ํจ์ฌ ๋ ๋ฐ์์ฑ์ด ์ข์์ง๋๋ค. ์ด๊ฒ์ ์ ํฅ ์์ฅ์ ์ฌ์ฉ์๋ ๊ตฌํ ๋ชจ๋ฐ์ผ ์ฅ์น ๋๋ ๋ ๊ฐ๋ ฅํ ์ปดํจํฐ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ๋ ์ฌ์ฉ์์๊ฒ ๋งค์ฐ ์ค์ํ๋ฉฐ, ์ ์ฝ๋ ๋ชจ๋ ๋ฐ๋ฆฌ์ด๊ฐ ๋ ๋์ ๊ฒฝํ์ ๊ธฐ์ฌํฉ๋๋ค.
- ๋คํธ์ํฌ ๋ถ๋ด ๊ฐ์: ๋ ๋น ๋ฅธ UI๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๊ฐ์ ์ ์ผ๋ก ์ค์ฌ ์ ์ธ๊ณ ๋ถ์ฐ ์ฌ์ฉ์๋ฅผ ์ํ ์ ์ฒด์ ์ธ ๋คํธ์ํฌ ์ฌ์ฉ๋์ ์ค์ด๋ ๋ฐ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
- ์ผ๊ด๋ ๊ฒฝํ: ์ธํฐ๋ท ์ธํ๋ผ ๋๋ ํ๋์จ์ด ๊ธฐ๋ฅ์ ๋ณํ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ง๋ฆฌ์ ์ง์ญ์์ ๋ณด๋ค ๊ท ์ผํ๊ณ ๊ณ ํ์ง์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
2. ๋ถ์ฐ ํ์ ์ํ ํฅ์๋ ํ์ฅ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ ์ฉ์ด์ฑ
- ๋ ๋ช
ํํ ์ข
์์ฑ: ์๋ก ๋ค๋ฅธ ์๊ฐ๋์ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ณ ๊ธฐ๋ฅ์์ ์์
ํ ๋
useContextSelector๋ ์ปดํฌ๋ํธ ์ข ์์ฑ์ ๋ช ์์ ์ผ๋ก ๋ง๋ญ๋๋ค. ์ปดํฌ๋ํธ๋ ์ ํํ *์ ํํ* ์ํ ์กฐ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ฆฌ๋ ๋๋ง๋์ด ์ํ ํ๋ฆ์ ์ฝ๊ฒ ์ถ๋ก ํ๊ณ ๋์์ ์์ธกํ ์ ์์ต๋๋ค. - ์ฝ๋ ์ถฉ๋ ๊ฐ์: ์ปดํฌ๋ํธ๊ฐ ์ปจํ ์คํธ ์๋น์์ ๋ ๊ฒฉ๋ฆฌ๋๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋๊ท๋ชจ ์ ์ญ ์ํ ๊ฐ์ฒด์ ๊ด๋ จ ์๋ ๋ถ๋ถ์ ๋ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ์๋์น ์์ ๋ถ์์ฉ์ ๊ฐ๋ฅ์ฑ์ด ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.
- ๋ ์ฌ์ด ์จ๋ณด๋ฉ: ๋ฐฉ๊ฐ๋ก๋ฅด, ๋ฒ ๋ฅผ๋ฆฐ ๋๋ ๋ถ์๋ ธ์ค์์ด๋ ์ค์ ์๋ก์ด ํ์์ `useContextSelector` ํธ์ถ์ ๋ณด๊ณ ์ ์ฒด ์ปจํ ์คํธ ๊ฐ์ฒด๋ฅผ ์ถ์ ํ ํ์ ์์ด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ์ดํดํ์ฌ ์ปดํฌ๋ํธ์ ์ฑ ์์ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์ต๋๋ค.
- ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ์ํ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ๊ณผ ์๋ช ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ์์ธก ๊ฐ๋ฅํ ์ํ ๊ด๋ฆฌ ์์คํ ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํด์ง๋๋ค. ์ด ํ ์ ์ ๊ธฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ์ฅ์ผ๋ก ์ธํด ๋ฐ์ํ ์ ์๋ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3. ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ
- ๋ ์ ์ ์๋ ๋ฉ๋ชจ์ด์ ์ด์ : ์ข ์ข ๊ฐ๋ฐ์๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค์ํ ์์ค์์ `React.memo` ๋๋ `useCallback`/`useMemo`๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ์ ํ ์ ์ฉํ์ง๋ง `useContextSelector`๋ ํนํ ์ปจํ ์คํธ ์๋น์ ๋ํ ์ด๋ฌํ ์๋ ์ต์ ํ์ ํ์์ฑ์ ์ค์ฌ ์ฝ๋๋ฅผ ๋จ์ํํ๊ณ ์ธ์ง ๋ถํ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ์ง์ค์ ์ธ ๊ฐ๋ฐ: ๊ฐ๋ฐ์๋ ๊ด๋ฒ์ํ ์ปจํ ์คํธ ์ ๋ฐ์ดํธ์ ๋ํด ๋์์์ด ๊ฑฑ์ ํ๋ ๋์ ํน์ ์ข ์์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ฉด์ ๊ธฐ๋ฅ ๊ตฌ์ถ์ ์ง์คํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก
experimental_useContextSelector๋ ์ ์ญ ์ํ๊ฐ ๋ณต์กํ๊ณ ๋ง์ ์ด๊ธฐ์ข
์ปดํฌ๋ํธ์์ ์๋น๋๋ ์๋๋ฆฌ์ค์์ ๋น์ ๋ฐํฉ๋๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ: `UserContext`๋ `userId`, `username`, `roles`, `permissions` ๋ฐ `lastLoginDate`๋ฅผ ๋ณด์ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ `userId`๋ง ํ์ํ๊ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ `roles`๋ง ํ์ํ๋ฉฐ `Dashboard` ์ปดํฌ๋ํธ๋ `username`๊ณผ `lastLoginDate`๊ฐ ํ์ํ ์ ์์ต๋๋ค. `useContextSelector`๋ ๊ฐ ์ปดํฌ๋ํธ๊ฐ ํน์ ์ฌ์ฉ์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ์ ๋ฐ์ดํธ๋๋๋ก ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ํ ๋ง ๋ฐ ํ์งํ: `SettingsContext`๋ `themeMode`, `currentLanguage`, `dateFormat` ๋ฐ `currencySymbol`์ ํฌํจํ ์ ์์ต๋๋ค. `ThemeSwitcher`๋ `themeMode`๋ง ํ์ํ๊ณ `DateDisplay` ์ปดํฌ๋ํธ๋ `dateFormat`๊ฐ ํ์ํ๊ณ `CurrencyConverter`๋ `currencySymbol`์ด ํ์ํฉ๋๋ค. ํน์ ์ค์ ์ด ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ง ์์ต๋๋ค.
- ์ ์ ์๊ฑฐ๋ ์ฅ๋ฐ๊ตฌ๋/์์๋ฆฌ์คํธ: `CartContext`๋ `items`, `totalQuantity`, `totalPrice` ๋ฐ `deliveryAddress`๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. `CartIcon` ์ปดํฌ๋ํธ๋ `totalQuantity`๋ง ์ ํํ๊ณ `CheckoutSummary`๋ `totalPrice`์ `items`๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํญ๋ชฉ์ ์๋์ด ์ ๋ฐ์ดํธ๋๊ฑฐ๋ ๋ฐฐ์ก ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค `CartIcon`์ด ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋์๋ณด๋: ๋ณต์กํ ๋์๋ณด๋๋ ์ข ์ข ์ค์ ๋ฐ์ดํฐ ์ ์ฅ์์์ ํ์๋ ๋ค์ํ ๋ฉํธ๋ฆญ์ ํ์ํฉ๋๋ค. ๋จ์ผ `DashboardContext`๋ `salesData`, `userEngagement`, `serverHealth` ๋ฑ์ ๋ณด์ ํ ์ ์์ต๋๋ค. ๋์๋ณด๋ ๋ด์ ๊ฐ๋ณ ์์ ฏ์ ์ ํ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ๋ ๋ฐ์ดํฐ ์คํธ๋ฆผ๋ง ๊ตฌ๋ ํ ์ ์์ผ๋ฏ๋ก `salesData`๋ฅผ ์ ๋ฐ์ดํธํด๋ `ServerHealth` ์์ ฏ์ ๋ฆฌ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋์ง ์์ต๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๊ฐ๋ ฅํ์ง๋ง `experimental_useContextSelector`์ ๊ฐ์ ์คํ์ API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์คํ๊ฒ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
1. "์คํ์ " ๋ ์ด๋ธ
- API ์์ ์ฑ: ์คํ์ ๊ธฐ๋ฅ์ด๋ฏ๋ก API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํฅํ React ๋ฒ์ ์์๋ ์๋ช ๋๋ ๋์์ด ๋ณ๊ฒฝ๋์ด ์ฝ๋ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ ์์ต๋๋ค. React์ ๊ฐ๋ฐ ๋ก๋๋งต์ ๋ํ ์ ๋ณด๋ฅผ ๊ณ์ ์ป๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ํ๋ก๋์ ์ค๋น ์ํ: ๋ฏธ์ ํฌ๋ฆฌํฐ์ปฌ ํ๋ก๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ํ์ ํ๊ฐํฉ๋๋ค. ์ฑ๋ฅ์์ ์ด์ ์ ๋ถ๋ช ํ์ง๋ง ์์ ์ ์ธ API๊ฐ ๋ถ์กฑํ๋ฉด ์ผ๋ถ ์กฐ์ง์์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ์๋ก์ด ํ๋ก์ ํธ๋ ์ค์๋๊ฐ ๋ฎ์ ๊ธฐ๋ฅ์ ๊ฒฝ์ฐ ์กฐ๊ธฐ ์ฑํ ๋ฐ ํผ๋๋ฐฑ์ ์ํ ์ ์ฉํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค.
2. ์ ํ๊ธฐ ํจ์ ์ค๊ณ
- ์์์ฑ ๋ฐ ํจ์จ์ฑ: ์ ํ๊ธฐ ํจ์๋ ์์ํด์ผ ํ๊ณ (๋ถ์์ฉ ์์) ๋น ๋ฅด๊ฒ ์คํ๋์ด์ผ ํฉ๋๋ค. ๋ชจ๋ ์ปจํ ์คํธ ์ ๋ฐ์ดํธ์์ ์คํ๋๋ฏ๋ก ์ ํ๊ธฐ ๋ด์์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ์ฑ๋ฅ ์ด์ ์ ๋ฌดํจํํ ์ ์์ต๋๋ค.
- ์ฐธ์กฐ ๋๋ฑ์ฑ: ๋น๊ต `===`๊ฐ ์ค์ํฉ๋๋ค. ์ ํ๊ธฐ๊ฐ ๋ชจ๋ ์คํ์์ ์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ(์: `state => ({ id: state.id, name: state.name })`) ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ๋์ผํ๋๋ผ๋ ํญ์ ๋ฆฌ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ ํ๊ธฐ๊ฐ ์์ ๊ฐ ๋๋ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ฒด/๋ฐฐ์ด์ ์ ์ ํ๊ฒ ๋ฐํํ๊ฑฐ๋ API๊ฐ ์ง์ํ๋ ๊ฒฝ์ฐ(ํ์ฌ `useContextSelector`๋ ์๊ฒฉํ ๋๋ฑ์ฑ์ ์ฌ์ฉํจ) ์ฌ์ฉ์ ์ง์ ๋๋ฑ์ฑ ํจ์๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋ค์ค ์ ํ๊ธฐ ๋ ๋จ์ผ ์ ํ๊ธฐ: ์ฌ๋ฌ ๊ณ ์ ํ ๊ฐ์ด ํ์ํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํ๋์ ์ ํ๊ธฐ๋ณด๋ค ์ด์ ์ด ๋ง์ถฐ์ง ์ ํ๊ธฐ๊ฐ ์๋ ์ฌ๋ฌ `useContextSelector` ํธ์ถ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ํ๋ ๊ฐ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ด๋ จ `useContextSelector` ํธ์ถ๋ง ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ ์ปดํฌ๋ํธ๋ ์ฌ์ ํ ๋ชจ๋ ์ ๊ฐ์ ์ฌ์ฉํ์ฌ ํ ๋ฒ๋ง ๋ฆฌ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋จ์ผ ์ ํ๊ธฐ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด์ ์์ฑ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
// ์ข์ต๋๋ค. ๊ณ ์ ํ ๊ฐ์ ๋ํ ์ฌ๋ฌ ์ ํ๊ธฐ
const theme = useContextSelector(GlobalSettingsContext, state => state.settings.theme);
const notificationsEnabled = useContextSelector(GlobalSettingsContext, state => state.settings.notificationsEnabled);
// ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ณ ๋ชจ๋ ์์ฑ์ด ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
const { theme, notificationsEnabled } = useContextSelector(GlobalSettingsContext, state => ({
theme: state.settings.theme,
notificationsEnabled: state.settings.notificationsEnabled
}));
๋ ๋ฒ์งธ ์์ ์์ `theme`์ด ๋ณ๊ฒฝ๋๋ฉด `notificationsEnabled`๊ฐ ๋ค์ ํ๊ฐ๋๊ณ ์ ๊ฐ์ฒด `{ theme, notificationsEnabled }`๊ฐ ๋ฐํ๋์ด ๋ฆฌ๋ ๋๋ง์ด ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค. `notificationsEnabled`๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ปดํฌ๋ํธ์ ๋ ๋ค ํ์ํ ๊ฒฝ์ฐ ๊ด์ฐฎ์ง๋ง `theme`๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ `notificationsEnabled` ๋ถ๋ถ์ด ๋ณ๊ฒฝ๋์ด๋ ๊ฐ์ฒด๊ฐ ๋งค๋ฒ ์๋ก ์์ฑ๋ ๊ฒฝ์ฐ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค.
3. ์ปจํ ์คํธ ์ ๊ณต์ ์์ ์ฑ
์ธ๊ธํ ๋ฐ์ ๊ฐ์ด `Context.Provider`์ `value` prop์ด `useMemo`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ์ด์ ์ด์ ๋์ด ์ ๊ณต์์ ๋ด๋ถ ์ํ๋ง ๋ณ๊ฒฝ๋๊ณ `value` ๊ฐ์ฒด ์์ฒด๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋ชจ๋ ์๋น์์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋์ง ํ์ธํฉ๋๋ค. ์ด๊ฒ์ `useContextSelector`์ ๊ด๊ณ์์ด Context API์ ๊ธฐ๋ณธ์ ์ธ ์ต์ ํ์ ๋๋ค.
4. ๊ณผ๋ํ ์ต์ ํ
๋ชจ๋ ์ต์ ํ์ ๋ง์ฐฌ๊ฐ์ง๋ก `useContextSelector`๋ฅผ ๋ชจ๋ ๊ณณ์ ๋ฌด์ฐจ๋ณ์ ์ผ๋ก ์ ์ฉํ์ง ๋ง์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ปจํ ์คํธ ๋ฆฌ๋ ๋๋ง์ด ๋๋ฆฐ ์ฑ๋ฅ์ ํฌ๊ฒ ๊ธฐ์ฌํ๋ ๊ฒฝ์ฐ `useContextSelector`๋ ํ๋ฅญํ ๋๊ตฌ์ ๋๋ค. ๋๋ฌผ๊ฒ ์ ๋ฐ์ดํธ๋๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ ํธ๋ฆฌ๊ฐ ์๋ ๊ฐ๋จํ ์ปจํ ์คํธ์ ๊ฒฝ์ฐ ํ์ค `useContext`๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค.
5. ์ปดํฌ๋ํธ ํ ์คํธ
`useContextSelector`๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ํ ์คํธ๋ `useContext`๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ ํ ์คํธ์ ์ ์ฌํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ํ๊ฒฝ์์ ํ ์คํธ ์ค์ธ ์ปดํฌ๋ํธ๋ฅผ ์ ์ ํ `Context.Provider`๋ก ๋ํํ๊ณ ์ํ๋ฅผ ์ ์ดํ๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ ๋ฐฉ์์ ๊ด์ฐฐํ ์ ์๋ ๋ชจ์ ์ปจํ ์คํธ ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
ํฅํ ์ ๋ง: React์์ ์ปจํ ์คํธ์ ๋ฏธ๋
`experimental_useContextSelector`์ ์กด์ฌ๋ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํ๊ธฐ ์ํ React์ ์ง์์ ์ธ ์ฝ์์ ๋ํ๋ ๋๋ค. Context API์ ์ค๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์ปจํ ์คํธ ์๋น๊ฐ ํฅํ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์งํํ ์ ์๋์ง์ ๋ํ ์ ์ฌ์ ์ธ ๋ฐฉํฅ์ ๋ํ๋ ๋๋ค. React ์ํ๊ณ๊ฐ ๊ณ์ ์ฑ์ํจ์ ๋ฐ๋ผ ๋ ํฐ ํจ์จ์ฑ, ํ์ฅ์ฑ ๋ฐ ๊ฐ๋ฐ์ ์ธ์ฒด ๊ณตํ์ ๋ชฉํ๋ก ํ๋ ์ํ ๊ด๋ฆฌ ํจํด์ ์ถ๊ฐ ๊ฐ์ ์ ์์ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก : ์ ๋ฐ๋๋ฅผ ํตํ ๊ธ๋ก๋ฒ React ๊ฐ๋ฐ ์ง์
experimental_useContextSelector๋ ์ปจํ
์คํธ ์๋น๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๊ณ ๋ถํ์ํ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ ํ๊ธฐ์ ์ผ๋ก ์ค์ด๋ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ React์ ์ง์์ ์ธ ํ์ ์ ๋ํ ์ฆ๊ฑฐ์
๋๋ค. ๋ชจ๋ ์ฑ๋ฅ ํฅ์์ด ๋๋ฅ ์ ์ญ์ ์ฌ์ฉ์์๊ฒ ๋ณด๋ค ์ ๊ทผ์ฑ, ๋ฐ์์ฑ ๋ฐ ์ฆ๊ฑฐ์ด ๊ฒฝํ์ผ๋ก ์ด์ด์ง๊ณ , ๋๊ท๋ชจ์ ๋ค์ํ ๊ฐ๋ฐ ํ์ด ๊ฐ๋ ฅํ๊ณ ์์ธก ๊ฐ๋ฅํ ์ํ ๊ด๋ฆฌ๋ฅผ ์๊ตฌํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ์ด ์คํ์ ํ
์ ๊ฐ๋ ฅํ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค.
๊ฐ๋ฐ์๋ `experimental_useContextSelector`๋ฅผ ์ ์คํ๊ฒ ์์ฉํจ์ผ๋ก์จ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ํํ๊ฒ ํ์ฅ๋ ๋ฟ๋ง ์๋๋ผ ์ ์ธ๊ณ ์ฌ์ฉ์์ ์ง์ญ ๊ธฐ์ ์กฐ๊ฑด์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋๊ฒ ๊ณ ์ฑ๋ฅ ๊ฒฝํ์ ์ ๊ณตํ๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์คํ์ ์ธ ์ํ๋ก ์ธํด ์ ์คํ ์ฑํ์ด ํ์ํ์ง๋ง ์ฑ๋ฅ ์ต์ ํ, ํ์ฅ์ฑ ๋ฐ ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ ์ธก๋ฉด์์์ ์ด์ ์ ๋๊ธ ์ต๊ณ ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ๋ชจ๋ ํ์ด ํ์ํ ๊ฐ์น๊ฐ ์๋ ๋งค๋ ฅ์ ์ธ ๊ธฐ๋ฅ์ ๋๋ค.
์ค๋ `experimental_useContextSelector`๋ก ์คํ์ ์์ํ์ฌ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ก์ด ์์ค์ ์ฑ๋ฅ์ ์ ๊ธ ํด์ ํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๋ ๋น ๋ฅด๊ณ ๊ฐ๋ ฅํ๋ฉฐ ์ฆ๊ฒ๊ฒ ๋ง๋์ญ์์ค.